package everyday;

import java.util.*;

/**
 * @author zhangmin
 * @create 2022-05-06 14:27
 * 剑指 Offer 59 - I. 滑动窗口的最大值
 * 给定一个数组 nums 和滑动窗口的大小 k，请找出所有滑动窗口里的最大值。
 *
 * 思路：
 * 单调队列：在窗口内维护单调栈
 */
public class maxSlidingWindow_offer59_1 {
    class MQueue{
        LinkedList<Integer> queue=new LinkedList<>();
        public MQueue(){

        }
        public void push(int n){
            while (!queue.isEmpty()&&queue.getLast()<n){
                queue.removeLast();
            }
            queue.addLast(n);
        }
        public void pop(int n){
            if (queue.getFirst()==n){
                queue.removeFirst();
            }
        }
        int getMax(){
            return queue.getFirst();
        }
    }
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n=nums.length;
        ArrayList<Integer> arr=new ArrayList<>();
        MQueue queue=new MQueue();
        for (int i = 0; i < n; i++) {
            if (i<k-1){
                queue.push(nums[i]);
            }else {
                queue.push(nums[i]);
                arr.add(queue.getMax());
                queue.pop(nums[i-k+1]);
            }
        }
        int[] res=new int[arr.size()];
        for (int i = 0; i < arr.size(); i++) {
            res[i]=arr.get(i);
        }
        return res;
    }
}
